4.6 Working with ModelDriven actions

  • 도메인 오브젝트를 유연하게 생성 할 수 있다? 소스 코드를 보면 이해가 될 듯합니다.ㅜ.ㅜ
  • Action에서 com.opensymphony.xwork.ModelDriven 인터페이스를 구현하면 된다.

4.6.1 Implementing ModelDriven actions

  • ModelDriven 에는 하나의 메소드만 있다.

public Object getModel()

① ModelDriven을 사용하지 않은 방법


public class UpdateUser extends ActionSupport implements UserDAOAware, Preparable, SessionAware {

    UserDAO userDAO;
    Map session;
    User user;
  
    public void setSession(Map session) {
      this.session = session;
    }
    
    public void setUserDAO(UserDAO userDAO) {
      this.userDAO = userDAO;
    }
    
    public void prepare() throws Exception {
      Long id = ((User)session.get(AuthenticationInterceptor.USER)).getId();
      user = userDAO.getUserById(id, false);
    }
    
    public String execute() throws Exception {
      userDAO.makePersistent(user);
      return SUCCESS;
    }
    
    public String doDefault() throws Exception {
      return INPUT;
    }
    
    public User getUser() {
      return user;
    }
}


<ww:form action="updateProfile" method="post">
  <ww:textfield label="%{getText('firstname')}"name="user.firstname"/>
  <ww:textfield label="%{getText('lastname')}" name="user.lastname"/>
  <ww:textfield label="%{getText('email')}" name="user.email"/>
  <ww:radio label="%{getText('gender')}" name="user.gender" blist="#{0 : getText('gender.male'),b1 : getText('gender.female')}"/>
  <ww:textfield label="%{getText('address.street')}" name="user.address.street"/>
  <ww:textfield label="%{getText('address.zipcode')}" name="user.address.zipcode"/>
  <ww:textfield label="%{getText('address.city')}" name="user.address.city"/>
  <ww:select label="%{getText('address.state')}" name="user.address.state" list="{'Californa', 'Oregon'}"/>
  <ww:select label="%{getText('address.country')}" name="user.address.country" list="{'USA', 'Canada', 'Mexico', 'Other'}"/>
  <ww:checkbox label="%{getText('address.poBox')}" name="user.address.poBox" fieldValue="true"/>
  <ww:submit value="%{getText('updateProfile')}"/>
</ww:form>

② ModelDriven을 사용한 방법


public class UpdateUser extends ActionSupport implements UserDAOAware, Preparable, SessionAware, ModelDriven {

    UserDAO userDAO;
    Map session;
    User user;
    
    public void setSession(Map session) {
      this.session = session;
    }
    
    public void setUserDAO(UserDAO userDAO) {
      this.userDAO = userDAO;
    }
    
    public void prepare() throws Exception {
      Long id = ((User)session.get(AuthenticationInterceptor.USER)).getId();
      user = userDAO.getUserById(id, false);
    }
    
    public String execute() throws Exception {
      userDAO.makePersistent(user);
      return SUCCESS;
    }
    
    public String doDefault() throws Exception {
      return INPUT;
    }
    
    //Change to getModel() to return User object
    public Object getModel() {  
      return user;
    }
}


//user. 이 사라졌다.
<ww:form action="updateProfile" method="post">
  <ww:textfield label="%{getText('firstname')}" name="firstname"/>
  <ww:textfield label="%{getText('lastname')}" name="lastname"/>
  <ww:textfield label="%{getText('email')}" name="email"/>
  <ww:radio label="%{getText('gender')}" name="gender" blist="#{0 : getText('gender.male'),b1 : getText('gender.female')}"/>
  <ww:textfield label="%{getText('address.street')}" name="address.street"/>
  <ww:textfield label="%{getText('address.zipcode')}" name="address.zipcode"/>
  <ww:textfield label="%{getText('address.city')}" name="address.city"/>
  <ww:select label="%{getText('address.state')}" name="address.state" list="{'Californa', 'Oregon'}"/>
  <ww:select label="%{getText('address.country')}" name="address.country" list="{'USA', 'Canada', 'Mexico', 'Other'}"/>
  <ww:checkbox label="%{getText('address.poBox')}" name="address.poBox" fieldValue="true"/>
  <ww:submit value="%{getText('updateProfile')}"/>
</ww:form>

문서에 대하여

  • 이 문서의 내용은 Webwork In Action 교재를 스터디 하면서 정리한 내용 입니다.
  • 최초작성자 : 김정식
  • 최초작성일 : 2007년 9월 21일
  • 이 문서는 오라클클럽 자바 웹개발자 스터디 모임에서 작성하였습니다.
  • 이 문서를 다른 블로그나 홈페이지에 퍼가실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^\^